#ifndef YPL_LINEARPREDICTION_H
#define YPL_LINEARPREDICTION_H

#include "Array1D.h"


namespace ypl

{


class LinearPrediction
{
public:

    /*!
     * @brief 向未来作预测
     * @param aSignal       -in-  已知信号
     * @param aPredicted    -out- 待预测信号，需指定待预测点数，即数组长度
     * @param iOrder        -in-  用来作线性预测的信号点数，不得超过已知信号点数。
     * 若超过，则取为原始信号点数
     */
    void predictFuture(const Array1D<Real>& aSignal,
                 Array1D<Real>& aPredicted,
                 Integral iOrder);

    /*!
     * @brief 向过去作预测
     * @param aSignal       -in-  已知信号
     * @param aPredicted    -out- 待预测信号，需指定待预测点数，即数组长度
     * @param iOrder        -in-  用来作线性预测的信号点数，不得超过已知信号点数。
     * 若超过，则取为原始信号点数
     */
    void predictPast(const Array1D<Real>& aSignal,
                     Array1D<Real>& aPredicted,
                     Integral iOrder);


    /*!
     * @brief 计算线性预测系数
     * @param aSignal       -in-  已知信号
     * @param aCoef         -out- 待计算的线性预测系数
     * @param iOrder        -in-  线性预测系数的个数，即用于预测的信号长度
     * @param mse           -out- 最小总体误差（minimum total square error）
     */
    void calcPredictCoef(const Array1D<Real>& aSignal,
                         Array1D<Real>& aCoef,
                         Integral p,
                         Real& mse);
protected:
    void calcAutoCorr(const Array1D<Real>& aSignal,
                      Array1D<Real>& R,
                      Integral p);
};


} // namespace ypl

#endif
